/**
 * @defgroup TestAnonymousInnerClass 测试Java内部匿名类的例子
 * @author 李焕帅
 * @version 0.1
 * @date 30/07/2012
 * @{
 */
/**
 * @name 包定义
 * @{
 */
package indd.lihs.basic.javabasictester;

/** @}*/
// 包定义

/**
 * @name 测试类型定义
 * @{
 */
public class TestAnonymousInnerClass
{
    /**
     * 主函数
     * @param[in] args 参数字符串数组
     * @return void
     * @note 某个方法可能抛出某种异常,但其中没有定义相应的捕获代码.这时如果抛出,\n
     *       则系统直接退出该方法,并将异常发回给调用者其中
     * @note 如果要在外部类之外创建内部类对象,必须用"外部类名.内部类名"来指定对象\n
     *       类型.非静态内部类的对象必须通过外部类对象来实现
     * @see indd.lihs.basic.javabasictester.ClassWithAnonymousInnerClass
     */
    public static void main(String[] args)
    {
        ClassWithAnonymousInnerClass cla = new ClassWithAnonymousInnerClass();
        ClassWithAnonymousInnerClass.InnerInterface in_int = cla
                        .getTestInterface(); // 实例化内部类
        in_int.display(); // 显示内部类信息
    }
}

/** @}*/
// 测试类定义

/**
 * @name 被测试类型定义
 * @{
 */
class ClassWithAnonymousInnerClass
{
    /** 随机常量 */
    private final double randam = Math.random();

    /**
     * Getter
     * @param[in] void
     * @return InnerInterface 新生成的接口类
     * @note 定义匿名内部类(不是显式的定义过程)
     * @par 例子:
     * @code ClassWithAnonymousInnerClass outer = new
     *       ClassWithAnonymousInnerClass();
     *       ClassWithAnonymousInnerClass.InnerInterface ti =
     *       outer.getTestInterface();
     * @endcode
     * @see indd.lihs.basic.javabasictester.TestAnonymousInnerClass
     */
    public InnerInterface getTestInterface()
    {
        /**
         * @name InnerInterface
         * @belief ClassWithAnonymousInnerClass的一个内部接口
         * @note 内部类可以声明为 private 或 protected 属性.\n
         *       声明静态内部类: static class 类名{};\n
         *       创建对象时: 外部类名.内部类名 对象名 = new 外部类名.内部类名();
         */
        return new InnerInterface()
        {
            /**
             * 匿名内部类的一个方法
             * @param[in] void
             * @return void
             * @note 内部类依赖于外部对象的实现\n
             *       内部类中可以访问外部类的数据成员和方法
             * @see indd.lihs.basic.javabasictester.ClassWithAnonymousInnerClass
             *      .InnerInterface#display()
             */
            public void display()
            {
                System.out.println("I am a anonymous class in ClassWithAnonymousInnerClass\n"
                                + "The value of field \'random\' of outer class \'ClassWithAnonymousInnerClass\' is "
                                + randam);
            }

        };
    }

    /**
     * @name 内部类的接口定义
     * @{
     */
    interface InnerInterface
    {
        /**
         * 接口的方法
         * @param[in] void
         * @return void
         * @note 接口本身不能实例话,需要其他类对其进行implement,并重写它的方法
         */
        void display();
    }
    /** @}*/
    // 内部类的接口定义
}

/** @}*/
// 被测试类型定义

/** @}*/
// 模块定义
